/**
 * 
 */

package com.gustozzi.distribucion.action;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.gustozzi.distribucion.action.util.Constantes;
import com.gustozzi.distribucion.negocio.GeneralBO;
import com.gustozzi.distribucion.negocio.impl.GeneralBOImpl;
import com.gustozzi.domain.Cliente;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author FABRIZIO
 * 
 */
public class ClienteAction extends ActionSupport implements ServletRequestAware
{

    private static final long serialVersionUID = 1L;
    GeneralBO generalBO = new GeneralBOImpl();
    private String botonSeleccionado;
    private Cliente cliente;
    private HttpServletRequest request;
    private List<Cliente> listaClientes;
    private ArrayList<String> listaSeleccionados;

    public String execute()
    {
        String destino = Constantes.CADENA_VACIA;
        try
        {
            if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_FILTRAR))
            {
                destino = obtenerListaClientes();
            }
            else if (botonSeleccionado.equalsIgnoreCase(Constantes.BTN_ACEPTAR))
            {
                destino = asignarClientes();
            }
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    public String obtenerListaClientes()
    {
        String destino = Constantes.CADENA_VACIA;
        List<Cliente> listaClientes = null;
        try
        {
            String numero = cliente.getNumero();
            String razonSocial = cliente.getRazonSocial();

            listaClientes = new ArrayList<Cliente>();
            listaClientes = generalBO.obtenerListaClientes(numero, razonSocial);
            request.getSession().setAttribute("listaClientesCompletaSession", listaClientes);
            this.setListaClientes(listaClientes);
            destino = Constantes.CONSULTARCLIENTE;
        }
        catch (Exception e)
        {
            destino = "ERROR";
        }
        return destino;
    }

    @SuppressWarnings("unchecked")
    public String asignarClientes()
    {
        String destino = "";
        List<Cliente> listaClientesSeleccionados = null;
        boolean indicadorCoincidencia = false;
        try
        {
            if (listaSeleccionados != null)
            {
                List<String> lista = listaSeleccionados;
                List<Cliente> listaClienteSession = (ArrayList<Cliente>) request.getSession().getAttribute(
                        "listaClientesCompletaSession");
                listaClientesSeleccionados = new ArrayList<Cliente>();
                for (int i = 0; i < listaClienteSession.size(); i++)
                {
                    Cliente cliente = listaClienteSession.get(i);
                    for (int j = 0; j < lista.size(); j++)
                    {
                        if (cliente.getCodigo().equalsIgnoreCase(lista.get(j)))
                        {
                            listaClientesSeleccionados.add(cliente);
                        }
                    }
                }
                if (request.getSession().getAttribute("listaClientesSession") != null)
                {
                    List<Cliente> listaPrevia = (ArrayList<Cliente>) request.getSession().getAttribute(
                            "listaClientesSession");
                    for (int k = 0; k < listaPrevia.size(); k++)
                    {
                        Cliente clientePrevio = listaPrevia.get(k);
                        indicadorCoincidencia = false;
                        for (int m = 0; m < listaClientesSeleccionados.size(); m++)
                        {
                            Cliente clienteNuevo = listaClientesSeleccionados.get(m);
                            if (clientePrevio.getCodigo().equalsIgnoreCase(clienteNuevo.getCodigo()))
                            {
                                indicadorCoincidencia = true;
                            }
                        }
                        if (!indicadorCoincidencia)
                        {
                            listaClientesSeleccionados.add(listaPrevia.get(k));
                        }
                    }
                }

                setListaClientes(listaClientesSeleccionados);
                request.getSession().removeAttribute("listaClientesCompletaSession");
                request.getSession().setAttribute("listaClientesSession", listaClientesSeleccionados);
            }
            destino = Constantes.CLIENTEASIGNADO;
        }
        catch (Exception e)
        {
            destino = Constantes.ERROR;
        }
        return destino;
    }

    /**
     * @param botonSeleccionado
     *            the botonSeleccionado to set
     */
    public void setBotonSeleccionado(String botonSeleccionado)
    {
        this.botonSeleccionado = botonSeleccionado;
    }

    @Override
    public void setServletRequest(HttpServletRequest request)
    {
        this.request = request;
    }

    /**
     * @return the listaSeleccionados
     */
    public ArrayList<String> getListaSeleccionados()
    {
        return listaSeleccionados;
    }

    /**
     * @param listaSeleccionados
     *            the listaSeleccionados to set
     */
    public void setListaSeleccionados(ArrayList<String> listaSeleccionados)
    {
        this.listaSeleccionados = listaSeleccionados;
    }

    /**
     * @return the listaClientes
     */
    public List<Cliente> getListaClientes()
    {
        return listaClientes;
    }

    /**
     * @param listaClientes
     *            the listaClientes to set
     */
    public void setListaClientes(List<Cliente> listaClientes)
    {
        this.listaClientes = listaClientes;
    }

    /**
     * @return the cliente
     */
    public Cliente getCliente()
    {
        return cliente;
    }

    /**
     * @param cliente
     *            the cliente to set
     */
    public void setCliente(Cliente cliente)
    {
        this.cliente = cliente;
    }
}